home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / SOUND / CRYS270.ZIP / CRYS260.ASM < prev    next >
Encoding:
Assembly Source File  |  1995-06-26  |  34.1 KB  |  1,954 lines

  1. ;***************************************************************************
  2. ;*    Ce module contient les fonctions qui jouent les MOD sans s'occuper
  3. ;*    toutefois de la restitution sonore en elle même
  4. ;*
  5. ;* Programmé par Sébastien Granjoux
  6. ;* Commencé le 02/01/95
  7. ;* Modification le 02/01/95
  8.  
  9. IDEAL
  10. P386N
  11.  
  12. PUBLIC    SETMODPOS
  13. PUBLIC    GETMODPOS
  14. PUBLIC    PEEKMOD
  15. PUBLIC    SETMOD
  16. PUBLIC    STARTMOD
  17. PUBLIC    STOPMOD
  18. PUBLIC    MAKEMOD
  19. PUBLIC    TOGGLEVOC
  20. PUBLIC    LOCKMOD
  21. PUBLIC    CHANGEVOL
  22. PUBLIC    DETECTSND
  23.  
  24. PUBLIC    Line
  25. PUBLIC    Position
  26.  
  27. INCLUDE "CRYSLOAD.INC"
  28. INCLUDE "CRYSDEV.INC"
  29. INCLUDE "CRYSERR.INC"
  30.  
  31. SEGMENT CODE PARA PUBLIC USE16 'CODE'
  32. ASSUME cs:CODE,ds:CODE
  33.  
  34.  
  35. DEFAULT_FRQ    EQU    1860
  36. Comments:
  37. SoundBuf    DB BUF_LEN DUP (?)
  38.         DB BUF_LEN DUP (?)
  39. SoundPtr    DW BUF_LEN
  40. SoundPage    DW 0
  41. VoicesLen    DW 0
  42.  
  43. DeviceStart:
  44.     REPT    16
  45.     DW  OFFSET NulDev
  46.     ENDM
  47. DeviceEnd:
  48.  
  49. Status        DB 0    ; 0 en marche 1-7 inutilisé
  50. IntMask        DW 0    ; masque d'interruption des 2 controleurs
  51. OldIrq        DD 0
  52.  
  53. UsedDevice    DW 0
  54. NbVoice        DB 0
  55. MixRate        DW 0
  56.  
  57.  
  58.  
  59. Instrument1    INSTRUMENT MAX_INST DUP (?)
  60. Voice1          VOICE MAX_VOICE DUP (?)
  61. PatternSeg      DW 0
  62. Sequence    DW MAX_PART DUP (0)
  63. LastPos        DW 0
  64.  
  65. Position    DW OFFSET Sequence    ; Ces deux variables doivent se suivre
  66. Line        DD 0            ; dans cet ordre pour SET/GETMODPOS
  67.  
  68. PatternDelay    DB 0
  69. Tempo        DB 6
  70. Frame        DB 1
  71. Bpm        DB 125
  72. MasterVol    DB 255
  73.  
  74. NoteTab        DW 1AC0h,1940h,17D0h,1680h
  75.         DW 1530h,1400h,12E0h,11D0h,10D0h,0FE0h,0F00h,0E28h
  76.  
  77. LOW_NOTE    EQU    1Ch
  78. HIGH_NOTE    EQU    1AC0h
  79.  
  80. Notes        DW HIGH_NOTE+39 DUP (?)    ;tables de conversion des note amiga
  81. VolumeTab    DB VOL_TAB_LEN DUP (?)       ;tables de multiplication
  82.  
  83. EffectTab       DW OFFSET set_arpeggio
  84.         DW OFFSET set_portamento_up
  85.         DW OFFSET set_portamento_down
  86.         DW OFFSET set_portamento_tone
  87.         DW OFFSET set_vibrato
  88.         DW OFFSET set_portamento_volume
  89.         DW OFFSET set_vibrato_volume
  90.         DW OFFSET set_tremolo
  91.         DW OFFSET set_nul_effect
  92.         DW OFFSET set_play_end_part
  93.         DW OFFSET set_volume_slide
  94.         DW OFFSET position_jump
  95.         DW OFFSET set_volume
  96.         DW OFFSET pattern_break
  97.         DW OFFSET set_extended_effect
  98.         DW OFFSET set_tempo
  99.  
  100.         DW OFFSET set_bpm
  101.         DW OFFSET set_tremor
  102.         DW OFFSET set_nul_effect
  103.         DW OFFSET set_nul_effect
  104.         DW OFFSET set_nul_effect
  105.         DW OFFSET set_nul_effect
  106.         DW OFFSET set_nul_effect
  107.         DW OFFSET set_nul_effect
  108.         DW OFFSET set_nul_effect
  109.         DW OFFSET set_nul_effect
  110.         DW OFFSET set_nul_effect
  111.         DW OFFSET set_nul_effect
  112.         DW OFFSET set_nul_effect
  113.         DW OFFSET set_nul_effect
  114.         DW OFFSET set_nul_effect
  115.         DW OFFSET set_nul_effect
  116.  
  117.  
  118. ;*************************************************************************
  119. ;*    Cette routine est appelé par chaque driver au début et sert à
  120. ;*    mettre leur adresse de début dans la table des devices
  121. ;*
  122. ;* Entrée:
  123. ;*    Dans la pile l'adresse du driver
  124. ;*
  125. ;* Sortie:
  126. ;*    AX    code d'erreur si C=1
  127.  
  128. PROC    Usedevice
  129.  
  130.     pop    bx    ;récupère l'adresse du driver
  131.     push    di
  132.     mov     ax,CODE
  133.     mov    es,ax
  134.     mov    di,OFFSET DeviceStart
  135.     mov    ax,OFFSET NulDev
  136.     mov    cx,OFFSET DeviceStart-OFFSET DeviceEnd
  137.     repne    scasw
  138.     mov    ax,TOO_MANY_DEV
  139.     cmp    di,OFFSET DeviceEnd
  140.     cmc
  141.     jb    @@error
  142.     mov    [es:di-2],bx
  143.     xor    ax,ax
  144. @@error:
  145.     pop    di
  146.     retf
  147.  
  148. ENDP
  149.  
  150. ;**************************************************************************
  151. ;*    Cette routine recherche la présence d'une carte sonore dans les
  152. ;*    variables d'environnement et renvoit la carte trouvé avec ses
  153. ;*    paramètre
  154. ;*
  155. ;* Entrée:
  156. ;*      adresse de la variable(16 bits) contenant la carte à detecter
  157. ;*    adresse de la variable(16 bits) contenant l'adresse du port
  158. ;*    adresse de la variable(8 bits) contenant l'IRQ
  159. ;*    adresse de la varibale(8 bits) contenant le DMA
  160. ;*
  161. ;* Sortie:
  162. ;*    Les différentes variables sont complété si elles étaient nulles
  163. ;*    code d'erreur
  164.  
  165. PROC    Detectsnd FAR
  166. LOCAL    port:WORD,irq:BYTE,dma:BYTE,dev:WORD,devadr:WORD,find:WORD=varloc
  167.  
  168.     enter    varloc,0
  169.     push    es
  170.     push    ds
  171.     push    di
  172.     push    si
  173.  
  174.     mov    [find],0
  175.     lds    di,[ss:bp+18]
  176.     mov    ax,[ds:di]
  177.     mov    [dev],ax
  178.     mov    ax,CODE
  179.     mov    ds,ax
  180.     ASSUME    ds:CODE
  181.  
  182.     mov    ah,62h
  183.     int    21h
  184.     mov    es,bx
  185.     mov    ax,[es:2Ch]
  186.     mov    es,ax
  187.  
  188.     mov    si,OFFSET DeviceStart
  189.     mov    [devadr],si
  190.  
  191. @@next_dev:
  192.     mov    bx,[ds:si]
  193.     cmp    bx,OFFSET NulDev
  194.     je    @@no_drv
  195.     mov    ax,[dev]
  196.     cmp    ax,0
  197.     je    @@search_dev
  198. @@search_id:
  199.     cmp    [(DEVICE PTR ds:bx).id],ax
  200.     je    @@search_dev
  201.     add    si,2
  202.     mov    bx,[ds:si]
  203.     cmp    bx,OFFSET NulDev
  204.     jne    @@search_id
  205. @@no_drv:
  206.     mov    ax,DRV_NOT_FOUND
  207.     jmp    @@error
  208.  
  209. @@search_dev:
  210.     mov    cx,0ffffh
  211.     add    bx,2
  212.     xor    di,di
  213. @@next_var:
  214.     mov    si,bx
  215.     lodsb
  216.     cmp     al,'$'
  217.     je    @@find_all
  218. @@get_next:
  219.     scasb
  220.     je    @@find_one
  221. @@not_dev:
  222.     dec    di
  223.     xor    al,al
  224.     repne    scasb
  225.     cmp    [byte ptr es:di],0
  226.     jne    @@next_var
  227.     cmp    [find],0
  228.     je    @@not_found
  229.     jmp    @@find_all
  230.  
  231. @@find_one:
  232.     repe    cmpsb
  233.         dec    di
  234.         lodsb
  235.     cmp    al,'='
  236.     jne    @@not_dev
  237. @@search_char:
  238.     cmp    [byte ptr es:di],0
  239.     je    @@not_dev
  240.     mov    ah,[es:di]
  241.     inc    di
  242.     cmp    ah,'a'
  243.     jb    @@no_maj
  244.     cmp    ah,'z'
  245.     ja    @@no_maj
  246.     sub    ah,20h
  247. @@no_maj:
  248.     cmp     ah,al
  249.     jne    @@search_char
  250. @@get_par:
  251.     lodsb
  252.     cmp    al,'p'
  253.     je    @@get_info
  254.     cmp    al,'i'
  255.     je    @@get_info
  256.     cmp    al,'d'
  257.     je    @@get_info
  258.     cmp    al,'t'
  259.     je    @@get_info
  260.     cmp    al,'$'
  261.     je    @@find_all
  262.     cmp    al,'!'
  263.     je    @@get_end
  264.     jmp    @@search_char
  265. @@get_info:
  266.     mov    ah,[es:di]
  267.     inc    di
  268.     or    ah,ah
  269.     je    @@not_dev
  270.     cmp    ah,'0'
  271.     jb    @@get_info
  272.     cmp    ah,'9'
  273.     ja    @@get_info
  274.  
  275.     dec    di
  276.     cmp    al,'p'
  277.     je    @@get_port
  278.     cmp    al,'i'
  279.     je    @@get_irq
  280.     cmp    al,'d'
  281.     je    @@get_dma
  282.     cmp    al,'t'
  283.     je    @@get_type
  284. @@get_port:
  285.     xor    dx,dx
  286.     xor    ah,ah
  287. @@next_digit:
  288.     mov    al,[es:di]
  289.     sub    al,'0'
  290.     jl    @@no_digit
  291.     cmp    al,'9'
  292.     jbe    @@under10
  293.     sub    al,6
  294.     cmp    al,10
  295.     jb    @@no_digit
  296.     cmp    al,16
  297.     jae    @@no_digit
  298. @@under10:
  299.     shl     dx,4
  300.     add    dx,ax
  301.     inc    di
  302.     jmp        @@next_digit
  303.  
  304. @@no_digit:
  305.     mov    [port],dx
  306.     jmp    @@get_par
  307.  
  308. @@get_dma:
  309.     mov    al,[es:di]
  310.     sub    al,'0'
  311.     mov    [dma],al
  312.     jmp    @@get_par
  313.  
  314. @@get_irq:
  315.     mov    ax,[es:di]
  316.     sub    ax,'00'
  317.     cmp    ah,9
  318.     ja    @@no_2digit
  319.     mov    al,ah
  320.     add    al,10
  321. @@no_2digit:
  322.     mov    [irq],al
  323.     jmp    @@get_par
  324.  
  325. @@get_type:
  326.     mov    dl,[es:di]
  327.     lodsw
  328.     cmp    al,dl
  329.     ja    @@not_dev
  330.     cmp    ah,dl
  331.     jb    @@not_dev
  332.     jmp    @@get_par
  333.  
  334. @@get_end:
  335.     mov    [find],1
  336.     jne    @@get_par
  337.  
  338. @@find_all:
  339.  
  340.     mov    bx,[ds:bx-2]
  341.  
  342.     lds    di,[ss:bp+18]
  343.     mov    [ds:di],bx
  344.  
  345.     mov    bx,[port]
  346.     lds    di,[ss:bp+14]
  347.     mov    [ds:di],bx
  348.  
  349.     mov    dl,[irq]
  350.     lds    di,[ss:bp+10]
  351.     mov    [ds:di],dl
  352.  
  353.     mov     dh,[dma]
  354.     lds    di,[ss:bp+6]
  355.     mov    [ds:di],dh
  356.  
  357. @@found:
  358.     pop    si
  359.     pop    di
  360.     pop    ds
  361.     pop    es
  362.     leave
  363.     clc
  364.     ret    4*4
  365.  
  366. @@not_found:
  367.     mov    ax,DEV_NOT_FOUND
  368.     cmp    [dev],0
  369.     jne    @@error
  370.     mov    si,[devadr]
  371.     add    si,2
  372.     mov    [devadr],si
  373.     jmp    @@next_dev
  374.  
  375. @@error:
  376.  
  377.     pop    si
  378.     pop    di
  379.     pop    ds
  380.     pop    es
  381.     leave
  382.     stc
  383.  
  384.     ret    4*4
  385.  
  386. ENDP
  387.  
  388.  
  389. ;***************************************************************************
  390. ;*    Cette fonction initialise les tables du programme suivant les
  391. ;*    paramètre passé par le programme principale
  392. ;*
  393. ;* Entrée:
  394. ;*
  395. ;*    Dans la pile en suivant cet ordre (en pascal)
  396. ;*
  397. ;*      CX    frequence en centaine de Hz (0 valeur par défaut)
  398. ;*      BX    numero de l'appareil de sortie du son
  399. ;*      DX    numero du port de l'appareil
  400. ;*    AL    numero de l'irq (0 valeur par défaut)
  401. ;*    AH    numero du canal DMA
  402.  
  403. PROC    Setmod FAR
  404.  
  405.     push    ds
  406.     push    es
  407.     push    si
  408.     push    di
  409.     push    bp
  410.     mov    bp,sp
  411.  
  412.     mov    ax,CODE
  413.     mov    ds,ax
  414.  
  415.     mov     ax,[ss:bp+20]
  416.     mov    bx,OFFSET DeviceStart
  417.     mov    si,[ds:bx]
  418.     cmp    si,0FFFFh
  419.     je    @@no_driver
  420. @@search_dev:
  421.     cmp    ax,[(DEVICE PTR ds:si).id]
  422.     je    @@find_dev
  423.     add    bx,2
  424.     mov    si,[ds:bx]
  425.     cmp    si,0FFFFh
  426.     jne    @@search_dev
  427. @@no_driver:
  428.     mov    [UsedDevice],OFFSET NulDev
  429.     mov    ax,DRV_NOT_FOUND
  430.     stc
  431.     jmp    @@error
  432.  
  433. @@find_dev:
  434.     mov    [UsedDevice],si
  435.  
  436.     mov    ax,[(DEVICE PTR ds:si).make]
  437.     sub    ax,OFFSET makedev+3
  438.     mov    [cs:OFFSET makedev+1],ax
  439.  
  440.     mov     ax,[(DEVICE PTR ds:si).setbpm]
  441.     sub    ax,OFFSET bpmeffect+3
  442.     mov    [cs:OFFSET bpmeffect+1],ax
  443.  
  444.     mov    [byte ptr cs:OFFSET switch_makemod],1Eh
  445.  
  446.     mov    ax,[ss:bp+18]
  447.     mov    [(DEVICE PTR ds:si).port],ax
  448.     mov    al,[ss:bp+16]
  449.     mov    [(DEVICE PTR ds:si).irq],al
  450.     mov    al,[ss:bp+14]
  451.     mov    [(DEVICE PTR ds:si).dma],al
  452.  
  453.     mov    ax,[ss:bp+22]
  454.     or    ax,ax
  455.     jne    @@no_default
  456.     mov     ax,DEFAULT_FRQ
  457. @@no_default:
  458.     mov    [MixRate],ax
  459.  
  460.     mov     cl,[NbVoice]
  461.     mov    al,SIZE VOICE
  462.     mul    cl
  463.     add    ax,OFFSET Voice1
  464.     mov    [cs:OFFSET nbvoicetest+2],ax
  465.  
  466.     mov    bx,OFFSET Voice1
  467.     mov    al,MAX_VOICE
  468. @@clear_voice:
  469.     mov    [(VOICE PTR ds:bx).mute],00h    ; Met les voix off
  470.     mov    [(VOICE PTR ds:bx).replen],MIN_REPEAT
  471.     mov    [(VOICE PTR ds:bx).samplen],MIN_REPEAT
  472.     mov    [(VOICE PTR ds:bx).effet],OFFSET retour
  473.     add    bx,SIZE VOICE
  474.     dec    al
  475.     jne    @@clear_voice
  476.  
  477.     mov    ah,[ds:OFFSET NbVoice]
  478.     xor    al,al
  479.     mov    [word ptr ds:OFFSET Line],ax
  480.     mov    bx,OFFSET Voice1
  481. @@next_voice:
  482.     mov    [(VOICE PTR ds:bx).mute],0FFh    ; Met les voix on
  483.     add    bx,SIZE VOICE
  484.     dec    ah
  485.     jne    @@next_voice
  486.  
  487.     mov    dx,[(DEVICE PTR ds:si).init]
  488.     call    dx
  489.     jc    @@error
  490.  
  491.     mov    al,[ds:Bpm]
  492.     mov    dx,[(DEVICE PTR ds:si).setbpm]
  493.     call    dx
  494.  
  495.     mov    dx,0057h   ; increment=1024/(Periode Amiga*cycle paula*frequence de mixage)
  496.     mov    ax,642Ah   ; dx:ax=16/2.79365*10^-6
  497.     div    [MixRate]  ; MinRate minimum=87=>870Hz
  498.     mov    cx,ax
  499.  
  500.     mov    bx,LOW_NOTE-17
  501. @@next_note:
  502.     mov    dx,cx
  503.     shr    dx,10
  504.     mov    ax,cx
  505.     shl    ax,6
  506.     cmp    dx,bx
  507.     jae    @@overflow
  508.     div     bx        ; divise 1024*(2.79365e-7*frequence)
  509. @@put_note:
  510.     shl    bx,1
  511.     mov    [ds:bx+OFFSET Notes],ax
  512.     shr    bx,1
  513.     inc    bx
  514.     cmp    bx,HIGH_NOTE+39
  515.     jne    @@next_note
  516.  
  517.     call    far Makemod
  518.     sub    [cs:SoundPtr],BUF_LEN
  519.  
  520.     mov    ax,NO_ERROR
  521.     clc
  522.  
  523. @@error:
  524.     leave
  525.     pop    di
  526.     pop    si
  527.     pop    es
  528.     pop    ds
  529.  
  530.     ret    10
  531.  
  532. @@overflow:
  533.     mov    ax,0ffffh
  534.     jmp    @@put_note
  535.  
  536. ENDP
  537.  
  538. ;**************************************************************************
  539. ;*      initialise le son
  540.  
  541. PROC    Startmod FAR
  542.  
  543.     push    ds
  544.     push    es
  545.     push    si
  546.     push    di
  547.  
  548.     mov    ax,CODE
  549.     mov    ds,ax
  550.     mov    si,[UsedDevice]
  551.  
  552.     mov    bl,[(DEVICE PTR ds:si).irq]
  553.     call    getirq
  554.     mov    [word ptr cs:OFFSET OldIrq],ax
  555.     mov    [word ptr cs:OFFSET OldIrq+2],dx
  556.  
  557.  
  558.     in    al,0A1h
  559.     mov    ah,al
  560.     in    al,21h
  561.     mov    [ds:IntMask],ax
  562.     mov    cl,[(DEVICE PTR ds:si).irq]
  563.     cmp    cl,8
  564.     jb    @@first_pic
  565.     mov    ch,al
  566.     mov    al,254
  567.     and    cl,7
  568.     rol    al,cl
  569.     and    ah,al
  570.     mov    al,cl
  571.     or    al,60h
  572.     out    0A0h,al
  573.     xchg    al,ah
  574.     out    0A1h,al
  575.     push    ax
  576.  
  577.     mov    al,ch
  578.     mov    cl,2
  579. @@first_pic:
  580.     mov    ah,254
  581.     rol    ah,cl
  582.     and    ah,al
  583.     mov    al,cl
  584.     or    al,60h
  585.     out    20h,al
  586.     xchg    al,ah
  587.     out    21h,al
  588.     push    ax
  589.  
  590.     mov    dx,[(DEVICE ptr ds:si).start]
  591.     call    dx
  592.  
  593.     pop    ax
  594.     out    21h,al
  595.     mov    al,ah
  596.     out    20h,al
  597.     cmp    [(DEVICE PTR ds:si).irq],8
  598.     jb    @@only_one
  599.     pop    ax
  600.     out    0A1h,al
  601.     mov    al,ah
  602.     out    0A0h,al
  603. @@only_one:
  604.     or    [ds:Status],1
  605.  
  606.     pop    di
  607.     pop    si
  608.     pop    es
  609.     pop    ds
  610.     ret
  611. ENDP
  612.  
  613. ;*************************************************************************
  614. ;*    Calcul de la musique sous interruption
  615.  
  616. PROC    IMakeMod
  617.  
  618.     sti
  619.     pushad
  620.     mov    ax,[cs:SoundPtr]
  621.     mov    bx,[cs:SoundPage]
  622.     mov    cx,[cs:VoicesLen]
  623.     add    cx,cx
  624.     sub    cx,bx
  625.     neg    cx
  626.     js    @@loop
  627.     cmp    ax,bx
  628.     jae    @@not_now
  629.     cmp    ax,cx
  630.     jb    @@not_now
  631.  
  632. @@make_now:
  633.     call far MAKEMOD
  634.     popad
  635.     iret
  636.  
  637. @@loop:
  638.     cmp    ax,bx
  639.     jb    @@make_now
  640.     and    cx,BUF_LEN-1
  641.     cmp    ax,cx
  642.     jae    @@make_now
  643.  
  644. @@not_now:
  645.     popad
  646.     iret
  647.  
  648. ENDP
  649.  
  650. ;*************************************************************************
  651. ;*    Calcul la musique
  652.  
  653. PROC    MAKEMOD    FAR
  654.  
  655. switch_makemod:
  656.     push    ds
  657.     mov    [byte ptr cs:OFFSET switch_makemod],0CBh
  658.     push    es
  659.     push    ebp
  660.     push    esi
  661.     push    edi
  662.  
  663.     mov    ax,CODE
  664.     mov    ds,ax
  665.  
  666.     mov    ecx,BUF_LEN*65536
  667.  
  668.     mov    ax,[SoundPtr]
  669.     mov    bx,[SoundPage]
  670.     mov     cx,bx
  671.     add    cx,[VoicesLen]
  672.  
  673.     cmp    cx,BUF_LEN
  674.     ja    @@loop        ; c'est bien ja et pas jae !!!
  675.     je    @@always_ok
  676.     cmp    ax,cx
  677.     jae    @@ok
  678. @@always_ok:
  679.     cmp    ax,bx
  680.     jb    @@ok
  681.  
  682. @@fin:
  683.     mov    [byte ptr cs:OFFSET switch_makemod],1Eh
  684.     pop    edi
  685.     pop    esi
  686.     pop    ebp
  687.     pop    es
  688.     pop    ds
  689.     ret
  690. @@loop:
  691.     and    cx,65535-BUF_LEN
  692.     cmp    ax,bx
  693.     jae    @@fin
  694.     cmp    ax,cx
  695.     jb    @@fin
  696.     rol    ecx,16
  697.  
  698. @@ok:
  699.     mov    ebp,ecx
  700.  
  701.     dec     [ds:Frame]
  702.     jne    @@no_new_note
  703.  
  704.     mov     al,[cs:OFFSET Tempo]
  705.     mov    [ds:OFFSET Frame],al
  706.  
  707.     cmp    [byte ptr ds:OFFSET PatternDelay],0
  708.     je    @@no_delay
  709.     dec    [byte ptr ds:OFFSET PatternDelay]
  710.     jmp    @@no_new_note
  711.  
  712. @@no_delay:
  713.  
  714.     les    di,[Line]
  715.     xor    al,al
  716.     mov    ah,[NbVoice]
  717.  
  718.     cmp    di,ax
  719.     jb     @@same_pattern
  720.  
  721.     sub    di,ax
  722.  
  723.     mov    si,[Position]
  724.     cmp    si,[LastPos]
  725.     jb    @@not_end_seq
  726.     mov    si,OFFSET Sequence
  727. @@not_end_seq:
  728.     mov    ax,[ds:si]
  729. lock_pat:
  730.     add    si,2
  731.     mov    [Position],si
  732.     mov    [word ptr ds:OFFSET Line+2],ax
  733.     mov    es,ax
  734.  
  735. @@same_pattern:
  736.  
  737.  
  738.     mov    si,OFFSET Voice1
  739. @@autre_voix:
  740.  
  741.     mov    ax,[(VOICE PTR ds:si).play]
  742.     mov    [(VOICE PTR ds:si).oldnote],ax
  743.  
  744.     mov     edx,[dword ptr es:di]   ;charge la voix
  745.     mov    cl,dl
  746.     and    cl,7Fh
  747.     jz    @@no_note
  748.  
  749.     ror     edx,19
  750.     mov     bl,dl
  751.         rol     edx,19
  752.     and     bl,31
  753.     cmp     bl,3
  754.     je      @@no_loadcurwp
  755.     mov    [(dword ptr (VOICE ptr ds:si).adrvoc)],0
  756.     or    [(VOICE ptr ds:si).gusinf],2
  757. @@no_loadcurwp:
  758.     movzx    bx,cl
  759.     and    bl,0Fh
  760.     add    bx,bx
  761.     mov    ax,[OFFSET NoteTab+bx]
  762.     shr    cl,4
  763.     shr    ax,cl
  764.     mov    [(VOICE PTR ds:si).note1],ax
  765.     mov    [(VOICE PTR ds:si).play],ax
  766. @@no_note:
  767.  
  768.     shr    edx,7
  769.     mov    bx,dx
  770.     and    bx,3Fh
  771.     je    @@no_inst
  772.  
  773.     cmp    bl,[(VOICE ptr ds:si).inst]
  774.     je    @@same_inst
  775.     mov    [(VOICE ptr ds:si).inst],bl
  776.     or    [(VOICE ptr ds:si).gusinf],01h
  777. @@same_inst:
  778.     or    [(VOICE ptr ds:si).gusinf],00ch    ; nouvel instrument
  779.  
  780.     shl    bx,3     ; CAR SIZE INSTRUMENT=8
  781.     add     bx,OFFSET Instrument1-SIZE INSTRUMENT
  782.     mov    eax,[dword ptr (INSTRUMENT ptr ds:bx).adrseg]
  783.     mov    [(dword ptr (VOICE ptr ds:si).adrvoc)+4],eax
  784.     mov    eax,[dword ptr (INSTRUMENT PTR ds:bx).length]
  785.     mov    [(dword ptr (VOICE ptr ds:si).samplen)],eax
  786. @@no_inst:
  787.  
  788.     shr    edx,6
  789.     mov    al,dl
  790.     and    al,3Fh
  791.     jz    @@no_vol
  792.     or    [(VOICE ptr ds:si).gusinf],8
  793.     inc    al
  794.     mov    [(VOICE ptr ds:si).volume],al
  795. @@no_vol:
  796.  
  797.     shr    edx,6
  798.     mov    bl,dl
  799.     and     bx,1Fh
  800.     mov    [(VOICE PTR ds:si).effnb],bl
  801.     add    bx,bx
  802.     mov    ax,[OFFSET EffectTab+bx]
  803.     mov    [(VOICE PTR ds:si).effet],ax
  804.  
  805.     shr    edx,5
  806.     mov    [(VOICE PTR ds:si).extra],dl
  807.  
  808.     add     di,4
  809.     add     si,SIZE VOICE
  810.  
  811. nbvoicetest:
  812.     cmp      si,OFFSET Voice1    ; Code automodifié
  813.     jb      @@autre_voix
  814.  
  815.     mov     [word ptr ds:OFFSET Line],di
  816.  
  817. @@no_new_note:
  818.     mov    si,OFFSET Voice1
  819.  
  820. makedev:
  821.     DB    0E9h
  822.     DW    0
  823.  
  824.  
  825. ENDP
  826.  
  827. ;***************************************************************************
  828. ;*    Procédure d'initialisation des différents effets
  829.  
  830. PROC    set_nul_effect
  831.  
  832.     mov    [(VOICE ptr ds:di).effnb],0eh
  833.     mov    [(VOICE ptr ds:di).effet],OFFSET retour
  834.     ret
  835. ENDP
  836.  
  837.  
  838. PROC    set_arpeggio
  839.     mov    al,[(VOICE ptr ds:di).extra]
  840.  
  841.     or    al,al
  842.     je        set_nul_effect
  843.  
  844.     mov    cx,[(VOICE PTR ds:di).note1]
  845.  
  846.     mov     bx,OFFSET TAB_ARPEGE-2
  847. @@not_find:
  848.     add     bx,2
  849.     cmp     cx,[ds:bx]
  850.     jb      @@not_find
  851.  
  852.     sub    cx,[ds:bx]
  853.     neg    cx
  854.     mov    [(VOICE ptr ds:di).note1],cx
  855.     mov    [(VOICE ptr ds:di).note2],cx
  856.     mov     cx,bx
  857.     shl     eax,12
  858.     shr    ax,11
  859.     add     bx,ax
  860.     mov     ax,[ds:bx]
  861.  
  862.     add     [(VOICE ptr ds:di).note1],ax
  863.     shr     eax,15
  864.     and    ax,001eh
  865.     mov     bx,cx
  866.     add     bx,ax
  867.     mov     ax,[ds:bx]
  868.     add     [(VOICE ptr ds:di).note2],ax
  869.     mov     [(VOICE ptr ds:di).effet],OFFSET arpeggio
  870.  
  871.     ret
  872.  
  873. ENDP
  874.  
  875. PROC    set_portamento_up
  876.  
  877.     mov    al,[(VOICE ptr ds:di).extra]
  878.     or    al,al
  879.     jne    @@new_port
  880.     mov    al,[(VOICE PTR ds:di).oldport]
  881. @@new_port:
  882.     mov       [(VOICE PTR ds:di).oldport],al
  883.     xor    ah,ah
  884.     mov     [(VOICE ptr ds:di).note2],ax
  885.     mov     [(VOICE ptr ds:di).effet],OFFSET portamento_up
  886.  
  887.     ret
  888.  
  889. ENDP
  890.  
  891. PROC    set_portamento_down
  892.  
  893.     mov    al,[(VOICE ptr ds:di).extra]
  894.     or    al,al
  895.     jne    @@new_port
  896.     mov    al,[(VOICE PTR ds:di).oldport]
  897. @@new_port:
  898.     mov       [(VOICE PTR ds:di).oldport],al
  899.     xor    ah,ah
  900.     mov    [(VOICE ptr ds:di).note2],ax;
  901.     mov    [(VOICE ptr ds:di).effet],OFFSET portamento_down
  902.  
  903.     ret
  904.  
  905. ENDP
  906.  
  907. PROC    set_portamento_tone
  908.  
  909.     mov    dx,[(VOICE ptr ds:di).oldnote]
  910.     mov    [(VOICE ptr ds:di).play],dx;
  911.     mov    al,[(VOICE ptr ds:di).extra]
  912.     or    al,al
  913.     jne    @@new_port
  914.     mov    al,[(VOICE PTR ds:di).oldport]
  915. @@new_port:
  916.     mov       [(VOICE PTR ds:di).oldport],al
  917.     xor    ah,ah
  918.     mov     [(VOICE ptr ds:di).note2],ax        ; la partie haute est toujours à 0
  919.  
  920.     cmp       dx,[(VOICE ptr ds:di).note1]
  921.     jb      @@tone_down
  922.     mov     [(VOICE ptr ds:di).effet],OFFSET portamento_tone_up
  923.     ret
  924.  
  925. @@tone_down:
  926.     mov     [(VOICE ptr ds:di).effet],OFFSET portamento_tone_down
  927.     ret
  928.  
  929. ENDP
  930.  
  931. PROC    set_vibrato
  932.  
  933.     mov    al,[(VOICE ptr ds:di).extra]
  934.     or    al,al
  935.     jne    @@new_vibrato
  936.     mov    al,[(VOICE ptr ds:di).oldvib]
  937. @@new_vibrato:
  938.     mov    [(VOICE PTR ds:di).oldvib],al
  939.     mov    ah,al
  940.     and    al,0fh
  941.     shr    ah,2
  942.     and    ah,3ch
  943.     mov    [(VOICE ptr ds:di).vitesse],ah
  944.     mov    [(VOICE ptr ds:di).amplit],al
  945.  
  946.     mov    [(VOICE ptr ds:di).effet],OFFSET vibrato
  947.  
  948.     ret
  949.  
  950. ENDP
  951.  
  952. PROC    set_portamento_volume
  953.  
  954.     mov    dx,[(VOICE ptr ds:di).oldnote]
  955.     mov    [(VOICE ptr ds:di).play],dx;
  956.     mov    al,[(VOICE PTR ds:di).oldport]
  957.     xor    ah,ah
  958.     mov     [(VOICE ptr ds:di).note2],ax        ; la partie haute est toujours à 0
  959.     cmp       dx,[(VOICE ptr ds:di).note1]
  960.     jb      @@tone_down
  961.  
  962.     mov    al,[(VOICE ptr ds:di).extra]
  963.     test    al,0f0h
  964.     je    @@up_vol_down
  965.     shr    al,4
  966.     mov    [(VOICE ptr ds:di).extra],al
  967.     mov    [(VOICE ptr ds:di).effet],OFFSET portamento_up_volume_up
  968.     ret
  969.  
  970. @@up_vol_down:
  971.     mov    [(VOICE ptr ds:di).extra],al
  972.     mov    [(VOICE ptr ds:di).effet],OFFSET portamento_up_volume_down
  973.     ret
  974.  
  975.     ret
  976.  
  977. @@tone_down:
  978.     mov    al,[(VOICE ptr ds:di).extra]
  979.     test    al,0f0h
  980.     je    @@down_vol_down
  981.     shr    al,4
  982.     mov    [(VOICE ptr ds:di).extra],al
  983.     mov    [(VOICE ptr ds:di).effet],OFFSET portamento_down_volume_up
  984.     ret
  985.  
  986. @@down_vol_down:
  987.     mov    [(VOICE ptr ds:di).extra],al
  988.     mov    [(VOICE ptr ds:di).effet],OFFSET portamento_down_volume_down
  989.     ret
  990.  
  991. ENDP
  992.  
  993.  
  994. PROC    set_vibrato_volume
  995.  
  996.     mov    al,[(VOICE ptr ds:di).oldvib]
  997.     mov    ah,al
  998.     and    al,0fh
  999.     shr    ah,2
  1000.     and    ah,3ch
  1001.     mov    [(VOICE ptr ds:di).vitesse],ah
  1002.     mov    [(VOICE ptr ds:di).amplit],al
  1003.  
  1004.     mov    al,[(VOICE ptr ds:di).extra]
  1005.     test    al,0f0h
  1006.     je    @@vol_down
  1007.     shr    al,4
  1008.     mov    [(VOICE ptr ds:di).extra],al
  1009.     mov    [(VOICE ptr ds:di).effet],OFFSET vibrato_volume_up
  1010.     ret
  1011.  
  1012. @@vol_down:
  1013.     mov    [(VOICE ptr ds:di).extra],al
  1014.     mov    [(VOICE ptr ds:di).effet],OFFSET vibrato_volume_down
  1015.     ret
  1016.  
  1017. ENDP
  1018.  
  1019. PROC    set_tremolo
  1020.  
  1021.     mov    al,[(VOICE ptr ds:di).extra]
  1022.     or    al,al
  1023.     jne    @@new_tremolo
  1024.     mov    al,[(VOICE PTR ds:di).oldtrem]
  1025. @@new_tremolo:
  1026.     mov    [(VOICE PTR ds:di).oldtrem],al
  1027.     mov    ah,al
  1028.     and    al,0fh
  1029.     shr    ah,2
  1030.     and    ah,3ch
  1031.     mov    [(VOICE ptr ds:di).vitesse],ah
  1032.     mov    [(VOICE ptr ds:di).amplit],al
  1033.     mov    [(VOICE PTR ds:di).sinpos],ah
  1034.     mov    al,[(VOICE PTR ds:di).volume]
  1035.     mov    [byte ptr (VOICE PTR ds:di).note2],al
  1036.     mov    [(VOICE ptr ds:di).effet],OFFSET tremolo
  1037.  
  1038.     ret
  1039.  
  1040. ENDP
  1041.  
  1042. PROC    set_play_end_part
  1043.  
  1044.     xor    eax,eax
  1045.     mov    ah,[(VOICE ptr ds:di).extra]
  1046.     cmp    ax,[(VOICE ptr ds:di).samplen]
  1047.     jb    @@ok
  1048.     mov    ax,[(VOICE ptr ds:di).samplen]
  1049. @@ok:
  1050.     mov    [(dword ptr (VOICE ptr ds:di).adrvoc)],eax
  1051.     or    [(VOICE ptr ds:di).gusinf],2    ; ne changer que curadr
  1052.  
  1053.     mov    [(VOICE ptr ds:di).effet],OFFSET retour
  1054.     ret
  1055.  
  1056. ENDP
  1057.  
  1058. PROC    set_volume_slide
  1059.  
  1060.     mov    al,[(VOICE ptr ds:di).extra]
  1061.     or    al,al
  1062.     jne    @@new_slide
  1063.     mov    al,[(VOICE PTR ds:di).oldslid]
  1064. @@new_slide:
  1065.     mov    [(VOICE PTR ds:di).oldslid],al
  1066.     test    al,0f0h
  1067.     je    @@vol_down
  1068.     shr    al,4
  1069.     mov    [(VOICE ptr ds:di).extra],al
  1070.     mov    [(VOICE ptr ds:di).effet],OFFSET volume_up
  1071.     ret
  1072.  
  1073. @@vol_down:
  1074.     mov    [(VOICE ptr ds:di).extra],al
  1075.     mov    [(VOICE ptr ds:di).effet],OFFSET volume_down
  1076.     ret
  1077.  
  1078. ENDP
  1079.  
  1080. PROC    position_jump
  1081.  
  1082.     movzx    ax,[(VOICE ptr ds:di).extra]
  1083.     add    ax,ax
  1084.     add    ax,OFFSET Sequence
  1085.     mov    [ds:OFFSET Position],ax
  1086.     mov    ah,[ds:OFFSET NbVoice]
  1087.     xor    al,al
  1088.     mov    [word ptr ds:OFFSET Line],ax
  1089.  
  1090.     mov    [(VOICE ptr ds:di).effet],OFFSET retour
  1091.  
  1092.     ret
  1093.  
  1094. ENDP
  1095.  
  1096. PROC    set_volume
  1097.  
  1098.     mov    al,[(VOICE ptr ds:di).extra]
  1099.     cmp    al,3Fh
  1100.     jbe    @@volume_ok
  1101.     mov    al,3Fh
  1102. @@volume_ok:
  1103.     or    [(VOICE ptr ds:di).gusinf],8
  1104.     mov    [(VOICE ptr ds:di).volume],al
  1105.     mov    [(VOICE ptr ds:di).effet],OFFSET retour
  1106.     ret
  1107.  
  1108. ENDP
  1109.  
  1110.  
  1111. PROC    pattern_break
  1112.  
  1113.     mov    al,[(VOICE ptr ds:di).extra]
  1114.         and    al,63
  1115.     add    al,64
  1116.     mov    cl,[ds:OFFSET NbVoice]
  1117.     mul    cl
  1118.     mov    cl,2
  1119.     shl    ax,cl
  1120.     mov    [ds:OFFSET Line],ax
  1121.  
  1122.     mov     [(VOICE ptr ds:di).effet],OFFSET retour
  1123.     ret
  1124.  
  1125. ENDP
  1126.  
  1127. Effets_etendus    DW OFFSET set_nul_effect
  1128.         DW OFFSET set_fine_portamento_up
  1129.         DW OFFSET set_fine_portamento_down
  1130.         DW OFFSET set_nul_effect
  1131.         DW OFFSET set_nul_effect
  1132.         DW OFFSET set_nul_effect
  1133.         DW OFFSET OFFSET set_loop
  1134.         DW OFFSET set_nul_effect
  1135.         DW OFFSET set_nul_effect
  1136.         DW OFFSET set_retrig_sample
  1137.         DW OFFSET set_fine_slide_volume_up
  1138.         DW OFFSET set_fine_slide_volume_down
  1139.         DW OFFSET set_cut_note
  1140.         DW OFFSET set_delay_note
  1141.         DW OFFSET set_pattern_delay
  1142.         DW OFFSET set_nul_effect
  1143.  
  1144. PROC    set_extended_effect
  1145.  
  1146.     mov    al,[(VOICE ptr ds:di).extra]
  1147.     mov    bl,al
  1148.     and    ax,0fh
  1149.     shr    bx,4
  1150.     and    bx,0fh
  1151.     mov     [(VOICE ptr ds:di).effnb],bl
  1152.     add    [(VOICE ptr ds:di).effnb],20h
  1153.     shl    bx,1
  1154.     mov    bx,[ds:bx+OFFSET Effets_etendus]
  1155.     jmp    bx
  1156. ENDP
  1157.  
  1158. PROC    set_fine_portamento_up
  1159.  
  1160.     mov    bx,[(VOICE ptr ds:di).play]
  1161.     sub     bx,ax
  1162.     cmp     bx,LOW_NOTE
  1163.     jae     @@suite
  1164.     mov     bx,LOW_NOTE
  1165. @@suite:
  1166.     mov     [(VOICE ptr ds:di).effet],OFFSET retour
  1167.     mov     [(VOICE ptr ds:di).play],bx
  1168.  
  1169.     ret
  1170. ENDP
  1171.  
  1172. PROC    set_fine_portamento_down
  1173.  
  1174.     mov    bx,[(VOICE PTR ds:di).play]
  1175.     add     bx,ax
  1176.     cmp     bx,HIGH_NOTE
  1177.     jbe     @@suite
  1178.     mov     bx,HIGH_NOTE
  1179. @@suite:
  1180.     mov     [(VOICE ptr ds:di).effet],OFFSET retour
  1181.     mov     [(VOICE ptr ds:di).play],bx
  1182.  
  1183.     ret
  1184.  
  1185. ENDP
  1186.  
  1187. PROC set_loop
  1188.  
  1189.     or    al,al
  1190.     je    @@setloop
  1191.  
  1192.     cmp    [(VOICE ptr ds:di).compte],0
  1193.     je    @@begin_loop
  1194.     dec    [(VOICE ptr ds:di).compte]
  1195.     je    @@end_loop
  1196.  
  1197. @@loop:
  1198.     mov    ax,[(VOICE PTR ds:di).looppos]
  1199.     mov    [ds:OFFSET Line],ax
  1200.  
  1201. @@end_loop:
  1202.     mov    [(VOICE ptr ds:di).looppos],0
  1203.     mov     [(VOICE ptr ds:di).effet],OFFSET retour
  1204.     ret
  1205.  
  1206. @@begin_loop:
  1207.     mov    [(VOICE ptr ds:di).compte],al
  1208.     jmp    @@loop
  1209.  
  1210. @@setloop:
  1211.     mov     ax,[ds:OFFSET Line]
  1212.     xor    bh,bh
  1213.     mov    bl,[NbVoice]
  1214.     shl    bx,2
  1215.     sub    ax,bx
  1216.     mov    [(VOICE PTR ds:di).looppos],ax
  1217.     mov    [(VOICE PTR ds:di).effet],OFFSET retour
  1218.     ret
  1219.  
  1220. ENDP
  1221.  
  1222. PROC set_retrig_sample
  1223.  
  1224.     mov    [(VOICE PTR ds:di).vitesse],al
  1225.     mov    [(VOICE PTR ds:di).extra],al
  1226.     mov    [(VOICE PTR ds:di).effet],OFFSET retrig_sample
  1227.  
  1228.     ret
  1229.  
  1230. ENDP
  1231.  
  1232. PROC set_fine_slide_volume_up
  1233.  
  1234.     mov     ah,[(VOICE ptr ds:di).volume]
  1235.     add     ah,al
  1236.     cmp     ah,3Fh
  1237.     jbe     @@ok
  1238.     mov     ah,3Fh
  1239. @@ok:
  1240.     mov     [(VOICE ptr ds:di).volume],ah
  1241.     or    [(VOICE ptr ds:di).gusinf],8
  1242.     mov    [(VOICE ptr ds:di).effet],OFFSET retour
  1243.  
  1244.     ret
  1245.  
  1246. ENDP
  1247.  
  1248. PROC set_fine_slide_volume_down
  1249.  
  1250.     mov     ah,[(VOICE ptr ds:di).volume]
  1251.     sub     ah,al
  1252.     jge     @@ok
  1253.     xor     ah,ah
  1254. @@ok:
  1255.     mov     [(VOICE ptr ds:di).volume],ah
  1256.     or    [(VOICE ptr ds:di).gusinf],8
  1257.     mov    [(VOICE ptr ds:di).effet],OFFSET retour
  1258.  
  1259.     ret
  1260.  
  1261. ENDP
  1262.  
  1263. PROC set_cut_note
  1264.  
  1265.     xor    ah,ah
  1266.     mov    [(VOICE PTR ds:di).note2],ax
  1267.     mov    [(VOICE PTR ds:di).effet],OFFSET cut_note
  1268.  
  1269.     ret
  1270.  
  1271. ENDP
  1272.  
  1273. PROC set_delay_note
  1274.  
  1275.     xor    ah,ah
  1276.     mov    [(VOICE PTR ds:di).note2],ax
  1277.     xchg    ah,[(VOICE PTR ds:di).volume]
  1278.     or    [(VOICE PTR ds:di).gusinf],4
  1279.     mov    [(VOICE PTR ds:di).amplit],ah
  1280.     mov    [(VOICE PTR ds:di).effet],OFFSET delay_note
  1281.  
  1282.     ret
  1283.  
  1284. ENDP
  1285.  
  1286. PROC    set_pattern_delay
  1287.  
  1288.     mov    [ds:PatternDelay],al
  1289.     mov    [(VOICE PTR ds:di).effet],OFFSET retour
  1290.  
  1291.     ret
  1292.  
  1293. ENDP
  1294.  
  1295. PROC    set_tempo
  1296.  
  1297.     mov    al,[(VOICE ptr ds:di).extra]
  1298.  
  1299.     mov     [ds:OFFSET Tempo],al
  1300.     mov    [ds:OFFSET Frame],al
  1301.     mov     [(VOICE ptr ds:di).effet],OFFSET retour
  1302.     ret
  1303.  
  1304. ENDP
  1305.  
  1306. PROC    set_bpm
  1307.  
  1308.     mov    al,[(VOICE ptr ds:di).extra]
  1309.     mov    [ds:OFFSET Bpm],al
  1310. bpmeffect:
  1311.     DB    0E8h
  1312.     DW    0
  1313.     mov    [(VOICE ptr ds:di).effet],OFFSET retour
  1314.     ret
  1315.  
  1316. ENDP
  1317.  
  1318. PROC    set_tremor
  1319.     mov    al,[(VOICE ptr ds:di).extra]
  1320.     mov    ah,al
  1321.     shr    al,4
  1322.         inc    al
  1323.     mov    [(VOICE PTR ds:di).note2],ax
  1324.     mov    [(VOICE PTR ds:di).effet],OFFSET tremor_on
  1325.  
  1326. ENDP
  1327.  
  1328. ;***************************************************************************
  1329. ;*      Procedures gerant les differents effets
  1330.  
  1331. PROC retour
  1332.     ret
  1333. ENDP
  1334.  
  1335. TAB_ARPEGE:
  1336.         DW  1AC0h,1940h,17D0h,1680h,1530h
  1337.         DW  1400h,12E0h,11D0h,10D0h,0FE0h
  1338.         DW  0F00h,0E28h,0D60h,0CA0h,0BE8h
  1339.         DW  0B40h,0A98h,0A00h,0970h,08E8h
  1340.         DW  868h,7F0h,780h,714h,6B0h,650h
  1341.         DW  5F4h,5A0h,54Ch,500h,4B8h,474h
  1342.         DW  43Ah,3F8h,3C0h,38Ah
  1343. ;TAB_ARPEGE:    DW  358h,328h,2fah,2d0h,2a6h,280h
  1344.         DW  25ch,23ah,21ah,1fch,1e0h,1c5h
  1345.         DW  1ach,194h,17dh,168h,153h,140h
  1346.         DW  12eh,11dh,10dh,0feh,0f0h,0e2h
  1347.         DW  0d6h,0cah,0beh,0b4h,0aah,0a0h
  1348.         DW  097h,08fh,087h,07fh,078h,071h
  1349.         DW  06Bh,065h,05Fh,05Ah,055h,050h
  1350.         DW  04Bh,047h,043h,03Fh,03Ch,038h
  1351.         DW  035h,032h,02Fh,02Dh,02Ah,028h
  1352.         DW  025h,023h,021h,01Fh,01Eh,01Ch
  1353.         DW  000h,01Ch,01Ch,01Ch,01Ch,01Ch
  1354.         DW  01Ch,01Ch,01Ch,01Ch,01Ch,01Ch
  1355.         DW  01Ch,01Ch,01Ch,01Ch
  1356.  
  1357. PROC    arpeggio
  1358.  
  1359.     mov    ax,[(VOICE ptr ds:di).play]
  1360.     xchg    ax,[(VOICE ptr ds:di).note1]
  1361.     xchg    ax,[(VOICE ptr ds:di).note2]
  1362.     mov    [(VOICE ptr ds:di).play],ax
  1363.  
  1364.     ret
  1365. ENDP
  1366.  
  1367. PROC portamento_up
  1368.  
  1369.     mov    ax,[(VOICE ptr ds:di).play]
  1370.     sub     ax,[(VOICE ptr ds:di).note2]
  1371.     jc    @@bug1992
  1372.     cmp     ax,LOW_NOTE
  1373.     jae     @@suite
  1374. @@bug1992:
  1375.     mov     ax,LOW_NOTE
  1376.     mov     [(VOICE ptr ds:di).effet],OFFSET retour
  1377. @@suite:
  1378.     mov     [(VOICE ptr ds:di).play],ax
  1379.  
  1380.     ret
  1381.  
  1382. ENDP
  1383.  
  1384. PROC portamento_down
  1385.  
  1386.     mov    ax,[(VOICE ptr ds:di).play]
  1387.     add     ax,[(VOICE ptr ds:di).note2]
  1388.     cmp     ax,HIGH_NOTE
  1389.     jbe     @@suite
  1390.     mov     ax,HIGH_NOTE
  1391.     mov     [(VOICE ptr ds:di).effet],OFFSET retour
  1392. @@suite:
  1393.     mov     [(VOICE ptr ds:di).play],ax
  1394.  
  1395.     ret
  1396.  
  1397. ENDP
  1398.  
  1399. PROC portamento_tone_up
  1400.  
  1401.     mov     bx,[(VOICE ptr ds:di).note1]
  1402.     mov     ax,[(VOICE ptr ds:di).play]
  1403.     sub     ax,[(VOICE ptr ds:di).note2]
  1404.     jc    @@bug1992
  1405.     cmp     ax,bx
  1406.     jae     @@suite
  1407. @@bug1992:
  1408.     mov     ax,bx
  1409.     mov     [(VOICE ptr ds:di).effet],OFFSET retour
  1410. @@suite:
  1411.     mov     [(VOICE ptr ds:di).play],ax
  1412.  
  1413.     ret
  1414.  
  1415. ENDP
  1416.  
  1417. PROC portamento_tone_down
  1418.  
  1419.     mov     ax,[(VOICE ptr ds:di).play]
  1420.     add     ax,[(VOICE ptr ds:di).note2]
  1421.     mov     bx,[(VOICE ptr ds:di).note1]
  1422.     cmp     ax,bx
  1423.     jbe     @@suite
  1424.     mov     ax,bx
  1425.     mov     [(VOICE ptr ds:di).effet],OFFSET retour
  1426. @@suite:
  1427.     mov     [(VOICE ptr ds:di).play],ax
  1428.  
  1429.     ret
  1430. ENDP
  1431.  
  1432. SINUS           DB  000h,018h,031h,04ah,061h,078h,08dh,0a1h
  1433.         DB  0b4h,0c5h,0d4h,0e0h,0ebh,0f4h,0fah,0fdh
  1434.         DB  0ffh,0fdh,0fah,0f4h,0ebh,0e0h,0d4h,0c5h
  1435.         DB  0b4h,0a1h,08dh,078h,061h,04ah,031h,018h
  1436.  
  1437. PROC vibrato
  1438.  
  1439.     mov    al,[byte ptr (VOICE ptr ds:di).sinpos]
  1440.     shr    al,2
  1441.     and    al,1fh
  1442.     mov    bx,OFFSET SINUS
  1443.     xlat
  1444.     mul    [(VOICE PTR ds:di).amplit]
  1445.     shr    ax,7
  1446.     mov    bx,[(VOICE PTR ds:di).note1]
  1447.     cmp    [(VOICE PTR ds:di).sinpos],0
  1448.     jg    @@add
  1449.     neg    ax
  1450. @@add:
  1451.     add    bx,ax
  1452.     cmp    bx,HIGH_NOTE
  1453.     jle    @@high_ok
  1454.     mov    bx,HIGH_NOTE
  1455. @@high_ok:
  1456.     cmp    bx,LOW_NOTE
  1457.     jge    @@low_ok
  1458.     mov    bx,LOW_NOTE
  1459. @@low_ok:
  1460.     mov    [(VOICE PTR ds:di).play],bx
  1461.     mov    al,[(VOICE PTR ds:di).vitesse]
  1462.     add    [(VOICE PTR ds:di).sinpos],al
  1463.  
  1464.     ret
  1465.  
  1466. ENDP
  1467.  
  1468. PROC portamento_up_volume_up
  1469.  
  1470.     mov     ax,[(VOICE ptr ds:di).play]
  1471.     sub     ax,[(VOICE ptr ds:di).note2]
  1472.     mov     bx,[(VOICE ptr ds:di).note1]
  1473.     cmp     ax,bx
  1474.     jae     @@suite
  1475.     mov     ax,bx
  1476.     mov     [(VOICE ptr ds:di).effet],OFFSET retour
  1477. @@suite:
  1478.     mov     [(VOICE ptr ds:di).play],ax
  1479.  
  1480.     jmp    volume_up
  1481.  
  1482. ENDP
  1483.  
  1484. PROC portamento_down_volume_up
  1485.  
  1486.     mov     ax,[(VOICE ptr ds:di).play]
  1487.     add     ax,[(VOICE ptr ds:di).note2]
  1488.     mov     bx,[(VOICE ptr ds:di).note1]
  1489.     cmp     ax,bx
  1490.     jbe     @@suite
  1491.     mov     ax,bx
  1492.     mov     [(VOICE ptr ds:di).effet],OFFSET retour
  1493. @@suite:
  1494.     mov     [(VOICE ptr ds:di).play],ax
  1495.  
  1496.     jmp    volume_up
  1497. ENDP
  1498.  
  1499. PROC portamento_up_volume_down
  1500.  
  1501.     mov     ax,[(VOICE ptr ds:di).play]
  1502.     sub     ax,[(VOICE ptr ds:di).note2]
  1503.     mov     bx,[(VOICE ptr ds:di).note1]
  1504.     cmp     ax,bx
  1505.     jae     @@suite
  1506.     mov     ax,bx
  1507.     mov     [(VOICE ptr ds:di).effet],OFFSET retour
  1508. @@suite:
  1509.     mov     [(VOICE ptr ds:di).play],ax
  1510.  
  1511.     jmp    volume_down
  1512.  
  1513. ENDP
  1514.  
  1515. PROC portamento_down_volume_down
  1516.  
  1517.     mov     ax,[(VOICE ptr ds:di).play]
  1518.     add     ax,[(VOICE ptr ds:di).note2]
  1519.     mov     bx,[(VOICE ptr ds:di).note1]
  1520.     cmp     ax,bx
  1521.     jbe     @@suite
  1522.     mov     ax,bx
  1523.     mov     [(VOICE ptr ds:di).effet],OFFSET retour
  1524. @@suite:
  1525.     mov     [(VOICE ptr ds:di).play],ax
  1526.  
  1527.     jmp    volume_down
  1528. ENDP
  1529.  
  1530. PROC vibrato_volume_up
  1531.  
  1532.     mov    al,[(VOICE ptr ds:di).sinpos]
  1533.     shr    al,2
  1534.     and    al,1fh
  1535.     mov    bx,OFFSET SINUS
  1536.     xlat
  1537.     mul    [(VOICE PTR ds:di).amplit]
  1538.     shr    ax,6
  1539.     mov    bx,[(VOICE PTR ds:di).note1]
  1540.     cmp    [(VOICE PTR ds:di).sinpos],0
  1541.     jg    @@add
  1542.     neg    ax
  1543. @@add:
  1544.     add    bx,ax
  1545.     mov    [(VOICE PTR ds:di).play],bx
  1546.     mov    al,[(VOICE PTR ds:di).vitesse]
  1547.     add    [(VOICE PTR ds:di).sinpos],al
  1548.  
  1549.     jmp    volume_up
  1550.  
  1551.     ret
  1552.  
  1553. ENDP
  1554.  
  1555. PROC vibrato_volume_down
  1556.  
  1557.     mov    al,[(VOICE ptr ds:di).sinpos]
  1558.     shr    al,2
  1559.     and    al,1fh
  1560.     mov    bx,OFFSET SINUS
  1561.     xlat
  1562.     mul    [(VOICE PTR ds:di).amplit]
  1563.     shr    ax,6
  1564.     mov    bx,[(VOICE PTR ds:di).note1]
  1565.     cmp    [(VOICE PTR ds:di).sinpos],0
  1566.     jg    @@add
  1567.     neg    ax
  1568. @@add:
  1569.     add    bx,ax
  1570.     mov    [(VOICE PTR ds:di).play],bx
  1571.     mov    al,[(VOICE PTR ds:di).vitesse]
  1572.     add    [(VOICE PTR ds:di).sinpos],al
  1573.  
  1574.     jmp    volume_down
  1575.  
  1576.     ret
  1577.  
  1578. ENDP
  1579.  
  1580. PROC tremolo
  1581.  
  1582.     mov    al,[(VOICE ptr ds:di).sinpos]
  1583.     shr    al,2
  1584.     and    al,1fh
  1585.     mov    bx,OFFSET SINUS
  1586.     xlat
  1587.     mul    [(VOICE PTR ds:di).amplit]
  1588.     shr    ax,7
  1589.  
  1590.     mov    bl,[byte ptr (VOICE PTR ds:di).note2]
  1591.     cmp    [(VOICE PTR ds:di).sinpos],0
  1592.     jg    @@add
  1593.     neg    ax
  1594. @@add:
  1595.     or    [(VOICE PTR ds:di).gusinf],8
  1596.     mov    bh,[(VOICE PTR ds:di).vitesse]
  1597.     add    [(VOICE PTR ds:di).sinpos],bh
  1598.     add    bx,ax
  1599.     jl    @@volume_min
  1600.     cmp    bl,3Fh
  1601.     ja    @@volume_max
  1602.  
  1603.     mov    [(VOICE PTR ds:di).volume],bl
  1604.     ret
  1605.  
  1606. @@volume_min:
  1607.     mov    [(VOICE PTR ds:di).volume],0
  1608.     ret
  1609.  
  1610. @@volume_max:
  1611.     mov    [(VOICE PTR ds:di).volume],3Fh
  1612.     ret
  1613. ENDP
  1614.  
  1615. PROC volume_up
  1616.     or    [(VOICE ptr ds:di).gusinf],8
  1617.     mov     al,[(VOICE ptr ds:di).volume]
  1618.     add     al,[(VOICE ptr ds:di).extra]
  1619.     cmp     al,3Fh
  1620.     jbe     @@ok
  1621.     mov     al,3Fh
  1622. @@ok:
  1623.     mov     [(VOICE ptr ds:di).volume],al
  1624.  
  1625.     ret
  1626.  
  1627. ENDP
  1628.  
  1629. PROC volume_down
  1630.     or    [(VOICE ptr ds:di).gusinf],8
  1631.     mov     al,[(VOICE ptr ds:di).volume]
  1632.     sub     al,[(VOICE ptr ds:di).extra]
  1633.     jge     @@ok
  1634.     xor     al,al
  1635. @@ok:
  1636.     mov     [(VOICE ptr ds:di).volume],al
  1637.  
  1638.     ret
  1639.  
  1640. ENDP
  1641.  
  1642. PROC    retrig_sample
  1643.  
  1644.     dec    [(VOICE PTR ds:di).vitesse]
  1645.     je    @@retrig
  1646.     ret
  1647.  
  1648. @@retrig:
  1649.     mov    [(dword ptr (VOICE PTR ds:di).adrvoc)],0
  1650.     or      [(VOICE ptr ds:di).gusinf],02h
  1651.     mov    al,[(VOICE PTR ds:di).extra]
  1652.     mov    [(VOICE PTR ds:di).vitesse],al
  1653.  
  1654.     ret
  1655.  
  1656. ENDP
  1657.  
  1658. PROC    cut_note
  1659.  
  1660.     dec    [(VOICE PTR ds:di).note2]
  1661.     je    @@cut_note
  1662.     ret
  1663.  
  1664. @@cut_note:
  1665.     or    [(VOICE PTR ds:di).gusinf],4
  1666.     mov    [(VOICE PTR ds:di).volume],0
  1667.     mov    [(VOICE PTR ds:di).effet],OFFSET retour
  1668.  
  1669.     ret
  1670.  
  1671. ENDP
  1672.  
  1673.  
  1674. PROC    delay_note
  1675.  
  1676.     dec    [(VOICE PTR ds:di).note2]
  1677.     je    @@delay_note
  1678.     ret
  1679.  
  1680. @@delay_note:
  1681.     or    [(VOICE PTR ds:di).gusinf],8
  1682.     mov    al,[(VOICE PTR ds:di).amplit]
  1683.     mov    [(VOICE PTR ds:di).volume],al
  1684.     mov    [(VOICE PTR ds:di).effet],OFFSET retour
  1685.  
  1686.     ret
  1687.  
  1688. ENDP
  1689.  
  1690. PROC    tremor_on
  1691.  
  1692.     dec    [(byte ptr (VOICE PTR ds:di).note2)]
  1693.     je    @@cut_note
  1694.     ret
  1695.  
  1696. @@cut_note:
  1697.     mov    al,[(byte ptr ((VOICE PTR ds:di).note2)+1)]
  1698.     and    al,0Fh
  1699.     inc    al
  1700.     mov    [(byte ptr (VOICE PTR ds:di).note2)],al
  1701.     mov    al,[(VOICE PTR ds:di).volume]
  1702.     mov     [(VOICE PTR ds:di).amplit],al
  1703.     mov    [(VOICE PTR ds:di).volume],0
  1704.     or    [(VOICE PTR ds:di).gusinf],4
  1705.     mov    [(VOICE PTR ds:di).effet],OFFSET tremor_off
  1706.  
  1707.     ret
  1708. ENDP
  1709.  
  1710. PROC    tremor_off
  1711.  
  1712.     dec    [(byte ptr (VOICE PTR ds:di).note2)]
  1713.     je    @@delay_note
  1714.     ret
  1715.  
  1716. @@delay_note:
  1717.     mov    al,[(byte ptr ((VOICE PTR ds:di).note2)+1)]
  1718.     shr    al,4
  1719.     inc    al
  1720.     mov    [(byte ptr (VOICE PTR ds:di).note2)],al
  1721.     or    [(VOICE PTR ds:di).gusinf],8
  1722.     mov    al,[(VOICE PTR ds:di).amplit]
  1723.     mov    [(VOICE PTR ds:di).volume],al
  1724.     mov    [(VOICE PTR ds:di).effet],OFFSET tremor_on
  1725.  
  1726.     ret
  1727.  
  1728. ENDP
  1729.  
  1730. ;*************************************************************************
  1731. ;*      termine le son
  1732.  
  1733. PROC    Stopmod FAR
  1734.  
  1735.     push    es
  1736.     push    ds
  1737.     push    si
  1738.     push    di
  1739.  
  1740.     mov    ax,CODE
  1741.     mov    ds,ax
  1742.  
  1743.     test    [Status],1
  1744.     je    @@no_stop
  1745.  
  1746.     mov    si,[UsedDevice]
  1747.     mov    dx,[(DEVICE ptr ds:si).stop]
  1748.     call    dx
  1749.  
  1750.     cli
  1751.     mov    bl,[(DEVICE PTR ds:si).irq]
  1752.     mov    ax,[word ptr ds:OFFSET OldIrq]
  1753.     mov    dx,[word ptr ds:OFFSET OldIrq+2]
  1754.     call    setirq
  1755.  
  1756.     mov    ax,[cs:IntMask]
  1757.     out    21h,al
  1758.     mov    al,ah
  1759.     out    0A1h,al
  1760.     sti
  1761. @@no_stop:
  1762.  
  1763.     pop    di
  1764.     pop    si
  1765.     pop    ds
  1766.     pop    es
  1767.     ret
  1768.  
  1769. ENDP
  1770.  
  1771. ;************************************************************************
  1772. ;*      Recupère l'octet courant de la voix
  1773. ;*
  1774. ;* Entrée:
  1775. ;*    Dans la pile le numero de la voix à éteindre (0 à 31)
  1776. ;*
  1777. ;* Sortie:
  1778. ;*    Octet courant
  1779.  
  1780. PROC    PeekMod far
  1781.  
  1782.     push    ds
  1783.     push    bp
  1784.     mov    bp,sp
  1785.  
  1786.     mov    al,[ss:bp+8]
  1787.     cmp    al,MAX_VOICE
  1788.     jae    @@error
  1789.  
  1790.     mov    bx,CODE
  1791.     mov    ds,bx
  1792.  
  1793.     mov    bx,[UsedDevice]
  1794.     mov    dx,[(DEVICE ptr ds:bx).getbyte]
  1795.     call    dx
  1796.  
  1797.     clc
  1798.     jmp    @@ok
  1799.  
  1800. @@error:
  1801.     stc
  1802.     mov    ax,NO_VOICE
  1803. @@ok:
  1804.     leave
  1805.     pop    ds
  1806.     ret    2
  1807.  
  1808. ENDP
  1809.  
  1810.  
  1811. ;************************************************************************
  1812. ;*    Eteint/Allume une voix
  1813. ;*
  1814. ;* Entrée:
  1815. ;*    Dans la pile le numero de la voix à éteindre (0 à 31)
  1816.  
  1817. PROC    Togglevoc FAR
  1818.  
  1819.     push    ds
  1820.     push    bp
  1821.     mov    bp,sp
  1822.  
  1823.     mov    al,[ss:bp+8]
  1824.     cmp    al,MAX_VOICE
  1825.     jae    @@error
  1826.  
  1827.     mov    bx,CODE
  1828.     mov    ds,bx
  1829.  
  1830.     mov    bl,SIZE VOICE
  1831.     mul    bl
  1832.     mov    bx,ax
  1833.  
  1834.     not    [(VOICE PTR ds:bx+OFFSET Voice1).mute]
  1835.  
  1836.     xor    ax,ax
  1837.     clc
  1838.     jmp    @@ok
  1839.  
  1840. @@error:
  1841.     stc
  1842.     mov    ax,NO_VOICE
  1843. @@ok:
  1844.     leave
  1845.     pop    ds
  1846.     ret    2
  1847.  
  1848. ENDP
  1849.  
  1850. ;***************************************************************************
  1851. ;*      Change le volume globale de la musique
  1852. ;*
  1853. ;* Entrée:
  1854. ;*    Dans la pile,le nouveau volume
  1855. ;*
  1856.  
  1857. PROC    Changevol FAR
  1858.  
  1859.     push    bp
  1860.     mov    bp,sp
  1861.  
  1862.     mov     al,[ss:bp+6]
  1863.     and    al,63
  1864.     shl    al,2
  1865.     mov    [cs:MasterVol],al
  1866.  
  1867.     leave
  1868.  
  1869.     ret    2
  1870.  
  1871. ENDP
  1872.  
  1873. ;***************************************************************************
  1874. ;*    Laisse boucler la musique sur le pattern courant
  1875. ;*
  1876.  
  1877. PROC    LockMod FAR
  1878.  
  1879.     xor    [byte ptr cs:OFFSET lock_pat+2],2
  1880.  
  1881.     ret
  1882.  
  1883. ENDP
  1884.  
  1885. ;***************************************************************************
  1886. ;*    Recupère la Séquence et la ligne courante
  1887. ;*
  1888. ;* Sortie
  1889. ;*    AX    ligne courante+position dans la séquence*64
  1890.  
  1891. PROC    GetModPos FAR
  1892.  
  1893.     mov    eax,[dword ptr cs:OFFSET Position]
  1894.     sub    ax,OFFSET Sequence+2
  1895.     sar    ax,1
  1896. @@good_pos:
  1897.     rol    eax,16
  1898.     mov    dh,[cs:NbVoice]
  1899.     cmp    ah,dh
  1900.     jb    @@no_overflow
  1901.     sub    ah,dh
  1902.     add     eax,10000h
  1903. @@no_overflow:
  1904.     div    dh
  1905.     mov    ah,al
  1906.     shr    eax,10
  1907.  
  1908.     ret
  1909.  
  1910.  
  1911. ENDP
  1912.  
  1913. ;***************************************************************************
  1914. ;*      Positionne la musique à endroit donnée
  1915. ;*
  1916. ;* Entrée:
  1917. ;*    Dans la pile la ligne+le numero de la sequence*64
  1918.  
  1919. PROC    SetModPos FAR
  1920.  
  1921.     pop    edx
  1922.     xor    eax,eax
  1923.     pop    ax
  1924.     push    edx
  1925.     shl    eax,10
  1926.     mov    al,ah
  1927.     mov    dh,[cs:NbVoice]
  1928.     mul    dh
  1929.     add    ah,dh
  1930.     rol    eax,16
  1931.     add    ax,ax
  1932.     add    ax,OFFSET Sequence
  1933.     mov    [dword ptr cs:OFFSET Position],eax
  1934.  
  1935.     ret
  1936.  
  1937. ENDP
  1938.  
  1939. NulDev        DEVICE <00h,'$',OFFSET setnul,OFFSET setnul,OFFSET nulfnc,OFFSET nulfnc,OFFSET defbpm,0,0,0>
  1940.  
  1941. ;***************************************************************************
  1942. ;*    Initialise le device nulle, court circuite la fonction MakeMod
  1943.  
  1944. PROC    setnul
  1945.  
  1946.     mov    [byte ptr cs:OFFSET switch_makemod],0CBh
  1947.     clc
  1948. nulfnc:
  1949.     ret
  1950. ENDP
  1951.  
  1952. ENDS
  1953.  
  1954. END